#include "FileDownloadRequestReceptorProcess.h"

FileDownloadRequestReceptorProcess::FileDownloadRequestReceptorProcess(LogFile* logFile) : Process(logFile) {
}

void FileDownloadRequestReceptorProcess::setRequestFifoName(string requestFifoName) {
	mkdir(ROOTDIRECTORY, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);

	this->requestFifoName = ROOTDIRECTORY + requestFifoName;
}

int FileDownloadRequestReceptorProcess::doWork() {
	// Registro los handlers para las señales:
	//    SIGINT: cuando el usuario desea cerrar la aplicacion.
	SIGINT_Handler sigint_handler;
	SignalHandler::getInstance()->registrarHandler(SIGINT, &sigint_handler);

	RequestFifo requestFifo(this->requestFifoName, this->logFile);
	SharedRecord request;

	FileUploaderProcess fileUploaderProcess(this->logFile);
	fileUploaderProcess.setParentProcessName(this->getProcessName());

	this->logFile->log("[" + this->getProcessName() + "] " + "Inicio de loop de recepcion de requests de descarga por el fifo: " + this->requestFifoName);

	do {
		strcpy(request.sharedFilePath, "");
		strcpy(request.requestFifo, "");

		bool validRead = requestFifo.readRequest(request);

		if (validRead) {
			this->logFile->log("[" + this->getProcessName() + "] " + "Iniciando proceso para atender un nuevo request de descarga " + "(file: " + request.sharedFilePath + " - fifo: " + request.requestFifo + ")");
			fileUploaderProcess.setRequest(request);
			fileUploaderProcess.setRequestReceptorFifoName(this->requestFifoName);
			fileUploaderProcess.start();
		}
		else {
			this->logFile->log("[" + this->getProcessName() + "] Hubo un error al leer un request por el fifo " + this->requestFifoName);
		}
	} while (!sigint_handler.quit());

	this->logFile->log("[" + this->getProcessName() + "] " + "El proceso salio del loop de recepcion de request de descarga por el fifo: " + this->requestFifoName);

	// Unlink del fifo.
	requestFifo.destroy();

	this->logFile->log("[" + this->getProcessName() + "] Esperando a que terminen todos los procesos de descarga de archivos iniciados.");
	fileUploaderProcess.wait();

	return 0;
}

string FileDownloadRequestReceptorProcess::getProcessName() {
	return string("FileDownloadRequestReceptor");
}

FileDownloadRequestReceptorProcess::~FileDownloadRequestReceptorProcess() {
}
